package ClientManager;

import java.util.HashMap;
import java.util.Map;

/**
 * 缓存管理
 */
public class CacheManager {
    //客户端缓存表 <table,server>
    private Map<String, String> mainCache;//主
    private Map<String, String> subCache1;//第一个副
    private Map<String, String> subCache2;//第二个副

    public CacheManager() {
        this.mainCache = new HashMap<>();
        this.subCache1 = new HashMap<>();
        this.subCache2 = new HashMap<>();
    }

    /**
     * 是否存在cache
     * @return
     */
    public boolean hasCache(String table){
        if(!mainCache.containsKey(table) && !subCache1.containsKey(table) && !subCache2.containsKey(table)){
            return false;
        }
        return true;
    }

    /**
     * 查询某张表是否存在客户端中，如果存在就直接返回表名
     * @param table 要查询的表名
     * @return
     */
    public String getMainCache(String table) {
        /*
        有缓存返回对应的server
        无缓存返回null
        */
        if (this.mainCache.containsKey(table)) {
            return this.mainCache.get(table);
        }
        return null;
    }
    public String getSubCache1(String table) {
        /*
        有缓存返回对应的server
        无缓存返回null
        */
        if (this.subCache1.containsKey(table)) {
            return this.subCache1.get(table);
        }
        return null;
    }
    public String getSubCache2(String table) {
        /*
        有缓存返回对应的server
        无缓存返回null
        */
        if (this.subCache2.containsKey(table)) {
            return this.subCache2.get(table);
        }
        return null;
    }

    /**
     * 更新ip
     * @param oldIP
     * @param newIP
     */
    public String updateIP(String tableName,String oldIP, String newIP){
        if(mainCache.get(tableName).equals(oldIP)){
            mainCache.put(tableName,newIP);
        }else if(subCache1.get(tableName).equals(oldIP)){
            subCache1.put(tableName,newIP);
        }else if(subCache2.get(tableName).equals(oldIP)){
            subCache2.put(tableName,newIP);
        }else{
            return "No table and old IP!";
        }
        return "Update cache success!";
    }
    /**
     * 在客户端缓存中存储已知的表和所在的服务器
     * @param table 数据表的名称n
     * @param server 服务器的IP地址和端口号
     */
    public void setMainCache(String table, String server) {
        mainCache.put(table, server);
        System.out.println("Write into cache: " + table + " Main region IP:" + server);
    }
    public void setSubCache1(String table, String server) {
        subCache1.put(table, server);
        System.out.println("Write into cache: " + table + " Sub region 1 IP:" + server);
    }
    public void setSubCache2(String table, String server) {
        subCache2.put(table, server);
        System.out.println("Write into cache: " + table + " Sub region 2 IP:" + server);
    }

    public void delCache(String table){
        /*
       删除缓存中的table
        */
        if(this.mainCache.containsKey(table)){
            this.mainCache.remove(table);
        }
        if(this.subCache1.containsKey(table)){
            this.subCache1.remove(table);
        }
        if(this.subCache2.containsKey(table)){
            this.subCache2.remove(table);
        }
    }
}
